package com.liuche.pictureserver.utils;

import cn.hutool.core.collection.CollUtil;

import java.util.*;
import java.util.function.Consumer;
import java.util.function.Function;

/**
 * Bean相关工具类
 *
 * @author liuche
 */
public class BeanUtil {

    private BeanUtil() {}
    /**
     * 转换对象
     *
     * @param source      源对象
     * @param targetClass 目标class
     * @param <T>         目标类型
     * @return 结果
     */
    public static <T> T toBean(Object source, Class<T> targetClass) {
        return cn.hutool.core.bean.BeanUtil.toBean(source, targetClass);
    }

    /**
     * 自定义转换对象
     *
     * @param source      源对象
     * @param targetClass 目标class
     * @param peek        自定义转换
     * @param <T>         目标类型
     * @return 结果
     */
    public static <T> T toBean(Object source, Class<T> targetClass, Consumer<T> peek) {
        T target = toBean(source, targetClass);
        if (target != null) {
            peek.accept(target);
        }
        return target;
    }


    /**
     * 集合转对象
     *
     * @param source     源对象
     * @param targetType 目标类型
     * @param <S>        源类型
     * @param <T>        目标类型
     * @return 结果
     */
    public static <S, T> List<T> toBean(List<S> source, Class<T> targetType) {
        if (CollUtil.isEmpty(source)) {
            return Collections.emptyList();
        }
        return convertList(source, s -> toBean(s, targetType));
    }


    /**
     * 将一个集合中的元素转换为另一个集合
     *
     * @param <T> 输入集合的元素类型
     * @param <U> 输出集合的元素类型
     * @param from 原始集合，从中转换元素
     * @param func 转换函数，用于将原始集合中的元素转换为新集合中的元素
     * @return 转换后的新集合，仅包含非空元素
     */
    public static <T, U> List<U> convertList(Collection<T> from, Function<T, U> func) {
        // 检查输入集合是否为空，如果为空则直接返回一个新的空集合
        if (CollUtil.isEmpty(from)) {
            return new ArrayList<>();
        }
        // 使用流处理，将集合中的每个元素通过转换函数转换为新元素，并过滤掉转换结果中的空值
        return from.stream().map(func).filter(Objects::nonNull).toList();
    }

}